﻿#ifndef __IMutex_H__
#define __IMutex_H__

#include <lampe/types.h>
#include "../IReferenceCounted.h"

namespace lampe{
namespace thread{

/**
* @class IMutex
* Интерфейсный класс мьютекса.
**/
class IMutex:public virtual lampe::IReferenceCounted{


public:
	/**
	* Блокирует мьютекс
	**/
	virtual void lock()=0;
	

	/**
	* Снимает блокировку с мьютекса
	**/
	virtual void unlock()=0;

	/**
	 * Возвращяет закрыт ли мьютекс
	 *
	 * @return TRUE если мьютекст закрыт, иначе FALSE
	 **/
	virtual bool isLocked()=0;

	/**
	 * Заставляет ожидать разблокировки мьютекса тот поток из которого
	 * был вызван метод. Ожидание будет длится бесконечное время
	 **/
	virtual void waitLock()=0;
	
	
    virtual void wait(lampe::u32 sleep_time=10)=0;
    virtual void waitTimeOut(lampe::u32 time_out,lampe::u32 sleep_time=10)=0;
};

IMutex* createDefaultMutex();
extern IMutex*createRecursiveMutex();

}//namespace thread
}//namespace irr


#endif
